import Food from './Food'
import Snake from './Snake'
import ScorePanel from './ScorePanel'

/**
 * 游戏控制器类
 */
class GameControl {
    food: Food
    snake: Snake
    scorePanel: ScorePanel

    // 移动的方向
    direction: string = ''

    // 游戏是否结束
    isLive: boolean = true

    constructor() {
        this.food = new Food()
        this.snake = new Snake()
        this.scorePanel = new ScorePanel(10, 3)
    }

    // 初始化
    init(): void {
        // 绑定键盘按下事件
        document.addEventListener('keydown', this.keydownHandler.bind(this))
        // 移动蛇
        this.run()
    }

    //键盘响应
    keydownHandler(event: KeyboardEvent): void {
        // TODO 检测用户是否按了正确的方向键
        // 修改方向
        this.direction = event.code
    }

    // 控制移动蛇
    run(): void {
        // 获取蛇现在的坐标
        let x = this.snake.X
        let y = this.snake.Y;
        // 根据方向来修改坐标
        switch (this.direction) {
            case 'ArrowUp':
            case 'Up': {
                y -= 10
                break
            }
            case 'ArrowDown':
            case 'Down': {
                y += 10
                break
            }
            case 'ArrowLeft':
            case 'Left': {
                x -= 10
                break
            }
            case 'ArrowRight':
            case 'Right': {
                x += 10
                break
            }
        }
        // 吃到食物处理
        this.checkEat(x, y)
        // 修改坐标，撞墙异常
        try {
            this.snake.X = x
            this.snake.Y = y
        } catch (e) {
            alert(e.message + ' 游戏结束！')
            // 结束游戏
            this.isLive = false
        }
        // 每隔循环调用
        let setupTime = 300 - (this.scorePanel.level - 1) * 30
        // 游戏没有结束就循环调用移动位置
        this.isLive && setTimeout(this.run.bind(this), setupTime)
    }

    // 检查蛇是否吃到食物
    checkEat(x: number, y: number): void {
        if (this.food.X === x && this.food.Y === y) {
            console.log('吃到食物');
            // 改变食物的位置
            this.food.change()
            // 分数增加
            this.scorePanel.addScore()
            // 蛇增加一节
            this.snake.addBody()
        }
    }
}

export default GameControl